package dao;

import classes.Evento;
import classes.EventoParticipante;
import classes.Servidor;
import conexao.GerenciadorConexao;
import controlador.LoginControlador;
import erro.ConexaoException;
import erro.ConsultaException;
import gui.EventoMostrar;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 *
 * @author Roberta
 */
public class EventoDao {

    private GerenciadorConexao g;

    public EventoDao() {
        g = GerenciadorConexao.getInstancia();
    }

    /**
     * 
     * @param e = Evento
     * @param ep = EventoParticipante
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public void inserirEvento(Evento e, EventoParticipante ep) throws ConexaoException, ConsultaException {
        String sql = "INSERT INTO evento (evento_id,evento,local,data,hora,obs,logado,status) VALUES (?,?,?,?,?,?,?,?)";
        String sqlEP = "INSERT INTO eventoparticipantes (codigoEvento,matricula,nome,email) VALUES (?,?,?,?)";
        List<Servidor> participantes = ep.getParticipante();
        int tamanho = participantes.size();
        try {
            g.connect().setAutoCommit(false);
            PreparedStatement pstmE = (PreparedStatement) g.connect().prepareStatement(sql);
            PreparedStatement pstmEP = (PreparedStatement) g.connect().prepareStatement(sqlEP);
            Date data = e.getData();
            e.setData(data);
            Date hora = e.getHora();
            e.setHora(hora);
            pstmE.setInt(1, e.getEvento_id());
            pstmE.setString(2, e.getEvento());
            pstmE.setString(3, e.getLocal());
            pstmE.setDate(4, new java.sql.Date(data.getTime()));
            pstmE.setTime(5, new java.sql.Time(hora.getTime()));
            pstmE.setString(6, e.getObs());
            pstmE.setInt(7, e.getLogado().getMatricula());
            pstmE.setInt(8, e.getStatus());
            pstmE.executeUpdate();
            pstmEP.setInt(1, ep.getEvento_id().getEvento_id());
            for (int j = 0; j < tamanho; j++) {
                pstmEP.setInt(2, participantes.get(j).getMatricula());
                pstmEP.setString(3, participantes.get(j).getNome());
                pstmEP.setString(4, participantes.get(j).getEmailProf());
                pstmEP.executeUpdate();
            }
            g.connect().commit();
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
    }

    /**
     * 
     * @param e = Evento
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public Evento consultarid(Evento e) throws ConexaoException, ConsultaException {
        String sql = "SELECT evento_id FROM evento ORDER BY evento_id DESC LIMIT 1";

        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            ResultSet rs = pstm.executeQuery();
            if (rs.next()) {
                e.setEvento_id(rs.getInt("evento_id"));
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return e;
    }

    /**
     * 
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public List<Evento> listar() throws ConexaoException, ConsultaException {
        List<Evento> lista = new ArrayList<Evento>();
        Evento e;
        String sql = "SELECT evento_id,evento,local,data,obs,hora,status FROM evento order by data asc";
        try {
            Statement stm = (Statement) g.connect().createStatement();
            ResultSet rs = stm.executeQuery(sql);

            while (rs.next()) {
                e = new Evento();
                e.setEvento_id(rs.getInt("evento_id"));
                e.setEvento(rs.getString("evento"));
                e.setLocal(rs.getString("local"));
                e.setData(rs.getDate("data"));
                e.setObs(rs.getString("obs"));
                e.setHora(rs.getTime("hora"));
                e.setStatus(rs.getInt("status"));
                lista.add(e);
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return lista;
    }

    /**
     * 
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public List<Evento> listarAbertos() throws ConexaoException, ConsultaException {
        List<Evento> lista = new ArrayList<Evento>();
        Evento e;
        String sql = "SELECT evento_id,evento,local,data,obs,hora,status FROM evento WHERE status=1 order by data asc";
        try {
            Statement stm = (Statement) g.connect().createStatement();
            ResultSet rs = stm.executeQuery(sql);

            while (rs.next()) {
                e = new Evento();
                e.setEvento_id(rs.getInt("evento_id"));
                e.setEvento(rs.getString("evento"));
                e.setLocal(rs.getString("local"));
                e.setData(rs.getDate("data"));
                e.setObs(rs.getString("obs"));
                e.setHora(rs.getTime("hora"));
                e.setStatus(rs.getInt("status"));
                lista.add(e);
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return lista;
    }

    /**
     * 
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public List<Evento> listarLogado() throws ConexaoException, ConsultaException {
        List<Evento> lista = new ArrayList<Evento>();
        Evento e = new Evento();
        String lc = LoginControlador.login;
        Servidor s = new Servidor();
        ServidorDao sdao = new ServidorDao();
        s.setLogin(lc);
        sdao.pesquisarLogin(s);
        e.setLogado(s);
        String sql = "SELECT evento_id,evento,local,data,obs,hora,status FROM evento WHERE logado=? order by data asc";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setInt(1, e.getLogado().getMatricula());
            ResultSet rs = pstm.executeQuery();

            while (rs.next()) {
                e = new Evento();
                e.setEvento_id(rs.getInt("evento_id"));
                e.setEvento(rs.getString("evento"));
                e.setLocal(rs.getString("local"));
                e.setData(rs.getDate("data"));
                e.setObs(rs.getString("obs"));
                e.setHora(rs.getTime("hora"));
                e.setStatus(rs.getInt("status"));
                lista.add(e);
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return lista;
    }

    /**
     * 
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public List<Evento> listarEncerrados() throws ConexaoException, ConsultaException {
        List<Evento> lista = new ArrayList<Evento>();
        Evento e;
        String sql = "SELECT evento_id,evento,local,data,obs,hora,status FROM evento WHERE status=2 order by data asc";
        try {
            Statement stm = (Statement) g.connect().createStatement();
            ResultSet rs = stm.executeQuery(sql);

            while (rs.next()) {
                e = new Evento();
                e.setEvento_id(rs.getInt("evento_id"));
                e.setEvento(rs.getString("evento"));
                e.setLocal(rs.getString("local"));
                e.setData(rs.getDate("data"));
                e.setObs(rs.getString("obs"));
                e.setHora(rs.getTime("hora"));
                e.setStatus(rs.getInt("status"));
                lista.add(e);

            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return lista;
    }

    /**
     * 
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public List<Evento> listarParticipo() throws ConexaoException, ConsultaException {
        List<Evento> lista = new ArrayList<Evento>();
        Evento e = new Evento();
        EventoParticipante ep = new EventoParticipante();
        String lc = LoginControlador.login;
        Servidor s = new Servidor();
        ServidorDao sdao = new ServidorDao();
        s.setLogin(lc);
        sdao.pesquisarLogin(s);
        e.setLogado(s);
        String sql = "SELECT * FROM evento,eventoparticipantes WHERE eventoparticipantes.matricula=? AND eventoparticipantes.codigoEvento=evento.evento_id";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setInt(1, e.getLogado().getMatricula());
            ResultSet rs = pstm.executeQuery();

            while (rs.next()) {
                e = new Evento();
                e.setEvento_id(rs.getInt("evento_id"));
                e.setEvento(rs.getString("evento"));
                e.setLocal(rs.getString("local"));
                e.setData(rs.getDate("data"));
                e.setObs(rs.getString("obs"));
                e.setHora(rs.getTime("hora"));
                e.setStatus(rs.getInt("status"));
                lista.add(e);
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return lista;
    }

    /**
     * 
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public List<EventoParticipante> listarP() throws ConexaoException, ConsultaException {
        String sql = "SELECT * FROM eventoparticipantes INNER JOIN evento ON  evento.evento_id=eventoparticipantes.codigoEvento AND evento.evento_id=?";
        EventoParticipante ep;
        Evento evento;
        List<EventoParticipante> lista = new ArrayList<EventoParticipante>();
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setInt(1, EventoParticipante.id_evento);
            ResultSet rs = pstm.executeQuery();
            while (rs.next()) {
                evento = new Evento();
                ep = new EventoParticipante();
                evento.setEvento_id(rs.getInt("codigoEvento"));
                ep.setEventoP_id(rs.getInt("participantes_id"));
                ep.setEvento_id(evento);
                ep.setNome(rs.getString("nome"));
                lista.add(ep);
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return lista;
    }

    /**
     * 
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public List<EventoParticipante> listarEP() throws ConexaoException, ConsultaException {
        String sql = "SELECT * FROM eventoparticipantes INNER JOIN evento ON  evento.evento_id=eventoparticipantes.codigoEvento AND evento.evento_id=? ORDER BY nome ASC";
        EventoParticipante ep;
        Evento evento;
        List<EventoParticipante> lista = new ArrayList<EventoParticipante>();
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setInt(1, EventoMostrar.id);
            ResultSet rs = pstm.executeQuery();
            while (rs.next()) {
                evento = new Evento();
                ep = new EventoParticipante();
                evento.setEvento_id(rs.getInt("codigoEvento"));
                ep.setEventoP_id(rs.getInt("participantes_id"));
                ep.setEvento_id(evento);
                ep.setNome(rs.getString("nome"));
                lista.add(ep);
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return lista;
    }

    /**
     * 
     * @param e = Evento
     * @return
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public Evento pesquisar(Evento e) throws ConexaoException, ConsultaException {

        String sql = "SELECT * FROM evento WHERE evento_id=?";
        try {
            PreparedStatement pstm = g.connect().prepareStatement(sql);
            pstm.setInt(1, e.getEvento_id());
            ResultSet rs = pstm.executeQuery();
            if (rs.next()) {
                e.setEvento_id(rs.getInt("evento_id"));
                e.setEvento(rs.getString("evento"));
                e.setObs(rs.getString("obs"));
                e.setData(rs.getDate("data"));
                e.setHora(rs.getTime("hora"));
                e.setLocal(rs.getString("local"));
                e.setStatus(rs.getInt("status"));
            }
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
        return e;
    }

    /**
     * 
     * @param e = Evento
     * @param ep = EventoParticipante
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public void deletarEvento(Evento e, EventoParticipante ep) throws ConexaoException, ConsultaException {

        String sql = "DELETE FROM evento WHERE evento_id =?";
        String sqlEP = "DELETE FROM eventoparticipantes WHERE codigoEvento=?";
        try {
            g.connect().setAutoCommit(false);
            PreparedStatement pstmEp = (PreparedStatement) g.connect().prepareStatement(sqlEP);
            PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);
            pstmEp.setInt(1, EventoMostrar.id);
            pstmEp.executeUpdate();

            pstm.setInt(1, e.getEvento_id());
            pstm.executeUpdate();
            g.connect().commit();
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
    }

    /**
     * 
     * @param e = Evento
     * @param ep = EventoParticipante
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public void alterarEvento(Evento e, EventoParticipante ep) throws ConexaoException, ConsultaException {
        String sql = "UPDATE evento SET evento=?,local=?,obs=?,data=?,hora=?,status=? WHERE evento_id=?";
        String sqlTs = "INSERT INTO eventoparticipantes (codigoEvento,matricula,nome,email) VALUES (?,?,?,?)";
        String sqlD = "DELETE FROM eventoparticipantes WHERE codigoEvento=?";
        List<Servidor> listaS = ep.getParticipante();
        int size = listaS.size();
        try {
            g.connect().setAutoCommit(false);
            PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);
            PreparedStatement pstmEP = (PreparedStatement) g.connect().prepareStatement(sqlTs);
            PreparedStatement pstmD = (PreparedStatement) g.connect().prepareStatement(sqlD);
            pstm.setString(1, e.getEvento());
            pstm.setString(2, e.getLocal());
            pstm.setString(3, e.getObs());
            pstm.setDate(4, new java.sql.Date(e.getData().getTime()));
            pstm.setTime(5, new java.sql.Time(e.getHora().getTime()));
            pstm.setInt(6, e.getStatus());
            pstm.setInt(7, e.getEvento_id());
            pstm.executeUpdate();
            pstmD.setInt(1, ep.getEvento_id().getEvento_id());
            pstmD.executeUpdate();
            pstmEP.setInt(1, ep.getEvento_id().getEvento_id());
            for (int i = 0; i < size; i++) {
                pstmEP.setInt(2, listaS.get(i).getMatricula());
                pstmEP.setString(3, listaS.get(i).getNome());
                pstmEP.setString(4, listaS.get(i).getEmailProf());
                pstmEP.executeUpdate();
            }

            g.connect().commit();
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
    }

    /**
     * 
     * @param e = Evento
     * @throws ConexaoException
     * @throws ConsultaException 
     */
    public void alterar(Evento e) throws ConexaoException, ConsultaException {

        String sql = "UPDATE evento SET evento=?,local=?,obs=?,data=?,hora=? WHERE evento_id=?";
        try {
            PreparedStatement pstm = (PreparedStatement) g.connect().prepareStatement(sql);

            pstm.setString(1, e.getEvento());
            pstm.setString(2, e.getLocal());
            pstm.setString(3, e.getObs());
            pstm.setDate(4, new java.sql.Date(e.getData().getTime()));
            pstm.setTime(5, new java.sql.Time(e.getHora().getTime()));

            pstm.setInt(6, e.getEvento_id());
            pstm.executeUpdate();
        } catch (SQLException ex) {
            throw new ConsultaException(ex);
        } finally {
            g.disconnect();
        }
    }
}
